from flask import Flask,url_for
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# endpoint 给路由函数指定自定义的 名称 或 标识符
@app.route('/index', methods=['GET', 'POST'],endpoint='v1')
def index():
    return 'index'

class RegexConverter(BaseConverter):
    """
    自定义 URL 匹配正则表达式
    执行顺序
    __init__()
    匹配成功后
    执行 to_python()
    """
    def __init__(self, map, regex):
        super(RegexConverter, self).__init__(map)
        self.regex = regex

    def to_python(self, value):
        """
        路由匹配时候，匹配成功 后传递给视图函数中参数的值
        :param value:
        :return:
        """
        return int(value)

    def to_url(self, value):
        """
        使用 url_for() 反向生成 URL 时，传递的参数经过该方法处理
        返回的值用于生成 URL 中的参数
        :param value:
        :return:
        """
        val = super(RegexConverter, self).to_url(value)
        return 'val'


# 告诉 flask 我们要定义 regex 这个转换器
# app.url_map.converters['转换器名称'] = RegexConverter
app.url_map.converters['regex'] = RegexConverter


@app.route('/indexA/<regex("\d+"):id>')
def indexA(id):
    print(id)
    v = url_for('indexA', id=999) # /indexA/999 原本结果应该是
    print(v) # /indexA/val
    # 因为执行了 to_url()
    return "indexA"


if __name__ == "__main__":
    app.run()